package Implementaciones;
import Implementaciones.Grafo.Vertice;
import TDA.*;

public class GrafoDir<E> implements GrafoDirTDA<E> {

	class Vertice<T>{
		T ver;
		
		@Override
		public boolean equals(Object elem){
			return ver.equals(elem);
		}
	}

	int [][] MAdy;
	Vertice<E> [] Etiqs;
	int cant_nodos;

	private int Vert2Indice(E v){
		int  i=cant_nodos-1;
		while((i>=0) && !Etiqs[i].equals(v))
			i--;
		return i;
	}
	
	public void AgregarArista(E v1, E v2, int peso) {
		int o=Vert2Indice(v1);
		int d=Vert2Indice(v2);
		MAdy[o][d]=peso;
	}

	public void AgregarVertice(E vert) {
		Etiqs[cant_nodos] = new Vertice<E>();
		Etiqs[cant_nodos].ver=vert;
		for(int i=0;i<=cant_nodos;i++){
			MAdy[cant_nodos][i]=0;
			MAdy[i][cant_nodos]=0;
		}
		cant_nodos++;
	}

	public E Elegir() {
		return Etiqs[0].ver;
	}

	public void EliminarArista(E v1, E v2) {
		int o=Vert2Indice(v1);
		int d=Vert2Indice(v2);
		MAdy[o][d]=0;
    }

	public void EliminarVertice(E v) {
		int i,k;
		int ind=Vert2Indice(v);
		for(i=ind;i<cant_nodos;i++){
			Etiqs[i]=Etiqs[i+1];
			for(k=0;k<cant_nodos;k++)
				MAdy[k][i]=MAdy[k][i+1];
			for(k=0;k<cant_nodos;k++)
				MAdy[i][k]=MAdy[i+1][k];
		}
		cant_nodos--;
	}

	public void InicializarGrafo() {
		MAdy = new int[100][100];
		Etiqs = new Vertice[100];
		cant_nodos=0;
	}

	public int PesoArista(E v1, E v2) {
		int o=Vert2Indice(v1);
		int d=Vert2Indice(v2);
		return MAdy[o][d];
	}

	public ConjuntoTDA<E> Adyacentes(E e) {
		int v=Vert2Indice(e);
		ConjuntoTDA<E> VertAdy=new Conjunto<E>();
		VertAdy.inicializarConjunto();
		
		for(int i=0;i<cant_nodos;i++){
			if (MAdy[v][i]!=0)
				VertAdy.agregar(Etiqs[i].ver);
		}
		return VertAdy;
	}

	public ConjuntoTDA<E> Vertices() {
		ConjuntoTDA<E> Vert=new Conjunto<E>();
		Vert.inicializarConjunto();
		
		for(int i=0;i<cant_nodos;i++){
			Vert.agregar(Etiqs[i].ver);
		}
		return Vert;
	}
	
	public boolean ExisteArista(E v1, E v2){
		int o=Vert2Indice(v1);
		int d=Vert2Indice(v2);
		return (MAdy[o][d] != 0);
	}

}
